{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Tutorial 11c - Surrogate Ray Tracing Model: Using Optiland and PyTorch\n",
    "\n",
    "### Introduction\n",
    "In this notebook, we will demonstrate how to create a surrogate ray-tracing model for a lens system using Optiland for data generation and PyTorch for model training. Specifically, we will:\n",
    "\n",
    "1. Model a double Gauss lens system in Optiland.\n",
    "2. Build a PyTorch dataloader to randomly generate and trace rays through the system. Inputs are reported as ray starting positions and outputs are the (x, y) intersections at the image plane.\n",
    "3. Train a PyTorch-based neural network to predict intersection points based on ray parameters.\n",
    "4. Assess performance of PyTorch model and compare to direct ray-traced result.\n",
    "5. Compare the speed of the surrogate model with the analytical ray tracer implemented in Optiland.\n",
    "\n",
    "By the end of this notebook, you will understand how to combine physics-based modeling with machine learning to accelerate computational tasks."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import time\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import torch\n",
    "from torch import nn, optim\n",
    "from torch.utils.data import DataLoader, Dataset\n",
    "\n",
    "from optiland.samples.objectives import DoubleGauss"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 1: Setting Up the Lens System with Optiland\n",
    "\n",
    "We will model a double Gauss lens system in Optiland. Below is the code to define and view the lens system."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "lens = DoubleGauss()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1000x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "lens.draw()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Check that maximum ray height on the image surface by tracing through the max normalized field coordinate and reporting the largest y intersection point:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Maximum radial position: 24.714 mm\n"
     ]
    }
   ],
   "source": [
    "rays = lens.trace(Hx=0, Hy=1, distribution=\"line_y\", wavelength=0.5876, num_rays=3)\n",
    "print(f\"Maximum radial position: {np.max(rays.y):.3f} mm\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 2: Data generation\n",
    "\n",
    "We will first create a few helper functions:\n",
    "- normalize and denormalize functions to bring x and y intersection points within the range (0, 1)\n",
    "- function to generate random normalized field and pupil coordinates, which will be used for ray tracing\n",
    "- function to generate random rays and trace them through a lens system"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def normalize(x, max_val=24.72):\n",
    "    \"\"\"Helper function to normalize the output values.\"\"\"\n",
    "    return x / max_val"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def denormalize(x, max_val=24.72):\n",
    "    \"\"\"Helper function to denormalize the output values.\"\"\"\n",
    "    return x * max_val"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def generate_random_coords(batch_size):\n",
    "    \"\"\"Generate random normalized field and pupil coordinates.\"\"\"\n",
    "    # get random field coordinates (Hx, Hy)\n",
    "    theta = np.random.uniform(0, 2 * np.pi, size=batch_size)\n",
    "    r = np.sqrt(np.random.uniform(0, 1, size=batch_size))\n",
    "    Hx = r * np.cos(theta)\n",
    "    Hy = r * np.sin(theta)\n",
    "\n",
    "    # get random pupil coordinates (Px, Py)\n",
    "    theta = np.random.uniform(0, 2 * np.pi, size=batch_size)\n",
    "    r = np.sqrt(np.random.uniform(0, 1, size=batch_size))\n",
    "    Px = r * np.cos(theta)\n",
    "    Py = r * np.sin(theta)\n",
    "\n",
    "    return Hx, Hy, Px, Py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def trace_random_rays(lens, batch_size):\n",
    "    \"\"\"Trace random rays through the lens system.\"\"\"\n",
    "    # get random field and pupil coordinates\n",
    "    Hx, Hy, Px, Py = generate_random_coords(batch_size)\n",
    "\n",
    "    # define fixed wavelength\n",
    "    wavelength = np.full(batch_size, 0.5876)\n",
    "\n",
    "    # trace rays and return\n",
    "    rays_out = lens.trace_generic(Hx, Hy, Px, Py, wavelength)\n",
    "\n",
    "    # normalize x and y coordinates based on max image height\n",
    "    rays_out.x = normalize(rays_out.x)\n",
    "    rays_out.y = normalize(rays_out.y)\n",
    "\n",
    "    return Hx, Hy, Px, Py, rays_out"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Dataset definition\n",
    "\n",
    "A PyTorch Dataset is a fundamental building block for creating data pipelines in PyTorch. The primary purpose of a Dataset is to provide an interface to access and manipulate data samples and their corresponding labels or targets. For our purposes, the data samples are the ray input coordinates and the targets are the ray intersection points at the image plane.\n",
    "\n",
    "Here we define a PyTorch dataset that will:\n",
    "\n",
    "1. Generate random rays and trace them through the system\n",
    "2. Prepare the model inputs by concatenating the field and pupil coordinates\n",
    "3. Prepare the model outputs by concatenating the ray (x, y) intersection points at the image plane\n",
    "4. Convert input and output arrays into torch tensors and return them"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "class BatchRayTracingDataset(Dataset):\n",
    "    def __init__(self, lens, num_rays, batch_size, seed=None):\n",
    "        \"\"\"Custom PyTorch dataset for batch-based ray tracing using Optiland.\n",
    "\n",
    "        Args:\n",
    "            lens (optiland.optic.Optic): The lens system to trace rays through.\n",
    "            num_rays (int): Total number of rays in the dataset.\n",
    "            batch_size (int): Number of rays to trace in a single batch.\n",
    "            seed (int, optional): Random seed for reproducibility. Defaults to None.\n",
    "\n",
    "        \"\"\"\n",
    "        self.lens = lens\n",
    "        self.num_rays = num_rays\n",
    "        self.batch_size = batch_size\n",
    "        self.num_batches = int(np.ceil(num_rays / batch_size))\n",
    "        if seed is not None:\n",
    "            np.random.seed(seed)\n",
    "\n",
    "    def __len__(self):\n",
    "        return self.num_batches\n",
    "\n",
    "    def __getitem__(self, idx):\n",
    "        \"\"\"Generates a batch of rays and traces them through the lens system.\"\"\"\n",
    "        # Determine the size of the batch\n",
    "        batch_start = idx * self.batch_size\n",
    "        batch_end = min(batch_start + self.batch_size, self.num_rays)\n",
    "        batch_size = batch_end - batch_start\n",
    "\n",
    "        # Trace random rays through the lens\n",
    "        Hx, Hy, Px, Py, rays_out = trace_random_rays(self.lens, batch_size)\n",
    "\n",
    "        # Prepare inputs (field and pupil coordinates)\n",
    "        inputs = np.column_stack((Hx, Hy, Px, Py))\n",
    "\n",
    "        # Prepare outputs (intersection points)\n",
    "        outputs = np.column_stack((rays_out.x, rays_out.y))\n",
    "\n",
    "        return torch.tensor(inputs, dtype=torch.float32), torch.tensor(\n",
    "            outputs,\n",
    "            dtype=torch.float32,\n",
    "        )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 3: Training the surrogate model using PyTorch\n",
    "\n",
    "We will use a simple fully connected neural network to predict the intersection points based on ray pupil and field coordinates.\n",
    "\n",
    "The network will take four inputs: the field coordinates (Hx, Hy) and the pupil coordinates (Px, Py). The output will be the predicted intersection points (x, y) at the image plane. The network architecture consists of three hidden layers with 128 neurons each, using ReLU activation functions, and an output layer with 2 neurons."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "class RayTracerSurrogate(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(RayTracerSurrogate, self).__init__()\n",
    "        self.fc = nn.Sequential(\n",
    "            nn.Linear(4, 128),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(128, 128),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(128, 128),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(128, 2),  # Output is (intersection_x, intersection_y)\n",
    "        )\n",
    "\n",
    "    def forward(self, x):\n",
    "        return self.fc(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This script will train on the GPU, if it's available.\n",
    "\n",
    "Note: Ensure that you have installed PyTorch with CUDA support to be able to train on the GPU."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using device: cuda\n"
     ]
    }
   ],
   "source": [
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "\n",
    "print(f\"Using device: {device}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define the dataset and dataloader for model training\n",
    "\n",
    "During training, we will use 1 million rays per epoch and a ray batch size of 100,000.\n",
    "\n",
    "This means that for each epoch (a complete pass through the entire dataset), the model will process 1 million rays.\n",
    "\n",
    "The ray batch size of 100,000 indicates that the model will process the rays in smaller groups or batches of 100,000 rays at a time. This is done to manage memory usage and computational efficiency, as processing the entire dataset at once may be impractical or impossible due to resource constraints.\n",
    "\n",
    "By dividing the dataset into batches, the model can be trained iteratively, updating its parameters after each batch, which helps in faster convergence and better generalization."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_rays = 1_000_000  # Total rays\n",
    "batch_size = 100_000  # Number of rays per batch\n",
    "dataset = BatchRayTracingDataset(lens, num_rays, batch_size, seed=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "dataloader = DataLoader(dataset, batch_size=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Instantiate the model, loss function, and optimizer\n",
    "\n",
    "We instantiate the model, define the loss function as Mean Squared Error (MSE), and use the Adam optimizer with a learning rate of 0.001. The model is moved to the GPU if available."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = RayTracerSurrogate().to(device)  # put model onto GPU (if available)\n",
    "criterion = nn.MSELoss()\n",
    "optimizer = optim.Adam(model.parameters(), lr=1e-3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Train the model over 50 epochs\n",
    "\n",
    "- **Training loop**: We train the model over 50 epochs. For each epoch, we:\n",
    "    - Initialize the total loss for the epoch.\n",
    "    - Iterate over the batches of data from the dataloader.\n",
    "    - Move the batch inputs and outputs to the GPU if available.\n",
    "    - Perform a forward pass to get the model predictions.\n",
    "    - Compute the loss between the predictions and the actual outputs.\n",
    "    - Perform a backward pass to compute the gradients.\n",
    "    - Update the model parameters using the optimizer.\n",
    "    - Accumulate the loss for the epoch.\n",
    "    - Print the loss every 10 epochs to monitor the training progress."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 10/100, Loss: 0.00196\n",
      "Epoch 20/100, Loss: 0.00082\n",
      "Epoch 30/100, Loss: 0.00053\n",
      "Epoch 40/100, Loss: 0.00044\n",
      "Epoch 50/100, Loss: 0.00058\n",
      "Epoch 60/100, Loss: 0.00030\n",
      "Epoch 70/100, Loss: 0.00027\n",
      "Epoch 80/100, Loss: 0.00031\n",
      "Epoch 90/100, Loss: 0.00048\n",
      "Epoch 100/100, Loss: 0.00023\n"
     ]
    }
   ],
   "source": [
    "num_epochs = 100\n",
    "for epoch in range(num_epochs):\n",
    "    total_loss = 0\n",
    "    for batch_inputs, batch_outputs in dataloader:\n",
    "        batch_inputs, batch_outputs = batch_inputs.to(device), batch_outputs.to(device)\n",
    "        optimizer.zero_grad()\n",
    "        predictions = model(batch_inputs)\n",
    "        loss = criterion(predictions, batch_outputs)\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        total_loss += loss.item()\n",
    "\n",
    "    if (epoch + 1) % 10 == 0:\n",
    "        print(f\"Epoch {epoch + 1}/{num_epochs}, Loss: {total_loss:.5f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The resulting mean squared error (MSE) is 0.00027, which corresponds to 75 µm when denormalized. This accuracy is reasonable, but may not be sufficient for many applications."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 4: Compare model performance to the direct ray-traced result\n",
    "\n",
    "We start by creating a helper function to generate the intersections predicted by the neural network, as well as the ground truth intersection points based on ray tracing."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "def compare_model_to_truth(model, lens, num_rays=1000):\n",
    "    # Trace random rays through the lens\n",
    "    Hx, Hy, Px, Py, rays_out = trace_random_rays(lens, num_rays)\n",
    "\n",
    "    # Prepare inputs (field and pupil coordinates)\n",
    "    inputs = np.column_stack((Hx, Hy, Px, Py))\n",
    "\n",
    "    # Predict the intersection points using the model\n",
    "    inputs_tensor = torch.tensor(inputs, dtype=torch.float32).to(device)\n",
    "    with torch.no_grad():\n",
    "        predictions = model(inputs_tensor).cpu().numpy()\n",
    "\n",
    "    pred_x = denormalize(predictions[:, 0])\n",
    "    pred_y = denormalize(predictions[:, 1])\n",
    "\n",
    "    true_x = denormalize(rays_out.x)\n",
    "    true_y = denormalize(rays_out.y)\n",
    "\n",
    "    return pred_x, pred_y, true_x, true_y"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Compare the model predictions to the ground truth for 25 random samples."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred_x, pred_y, true_x, true_y = compare_model_to_truth(model, lens, num_rays=25)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plotting the predicted points versus the ground truth points indicates the model result compares reasonably well to the ground truth result."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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ePFidlYkIr/W2FCrsflWU02bb7HxVutwrHvga8t/wzaHhI0bN6KkpAQPPfQQ3nvvPVx88cUYM2YM3n//fTQ0NLT16YiIOlVjQ62Wmm/FotJnP1IWGhoKAKivr1e5ErpQLpcLABASEnLefS94CuS+ffuQm5uLv/zlLzAYDJg8eTIyMjLQv3//C3la1XAKJFH34vZImPDcOqxwzJMvMZy9INhM/SJsmHNn0PfVON/xz2az4dSpU7BYLAgPD2d33QDk8XhQWlqK0NBQ9OnT57z/DS9odoPNZsO2bduwbds2hISE4NZbb8W3336LQYMGYcmSJcjMzLyQpyciumAhNaXeaY6uM2MQbGc33wrNRkjN9Rxlfx5WqxUAUFFRoXIldCG0Wm2rAgLQjpDQ0NCAv/3tb8jNzcU//vEPDB48GLNmzcLdd98tJ88PP/wQ999/P0MCEalPZ0B4TyvqAcxsyILN5e2TYIMZM/WLzvRJ0BnO/TwEjUaD2NhYWCwWXl4OYGFhYdBqWzfaoM0hITY2Fh6PB2lpaSgoKMBVV13VbJ+UlBRERka29amJiDre6UY+4c5abFDsuHg9G/m0UUhISKuuZ1Pga/OYhLfffht33HFH29tyBgiOSSCiYMXjH52tzWcS7rnnns6og4iIiPwMOy4SERGRIoYEIiIiUsSQQERERIoYEoiIiEgRQwIREREpYkggIiIiRQwJREREpIghgYiIiBQxJBAREZEihgQiIiJSxJBAREREihgSiIiISBFDAhERESliSCAiIiJFDAlERESkiCGBiIiIFDEkEBERkSKGBCIiIlLEkEBERESKGBKIiIhIEUMCERERKWJIICIiIkUMCURERKSIIYGIiIgUMSQQERGRIoYEIiIiUsSQQERERIoYEoiIiEgRQwIREREpYkggIiIiRQwJREREpIghgYiIiBQxJBAREZEihgQiIiJSxJBAREREihgSiIiISBFDAhERESliSCAiIiJFDAlERESkiCGBiIiIFDEkEBERkSKGBCIiIlIUMCHh2WefxbXXXovw8HBERkYq7nP8+HGMHTsW4eHhsFgsePzxx/HLL790baFERETdxEVqF9BaLpcLd9xxB5KTk/H666832+52uzF27FhYrVZ8+eWXsNlsuPfeexEaGorFixerUDEREVFg00iSJKldRFusWbMGs2bNwqlTp3zu//vf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lZWF6667DkOHDsXUqVOxffv2jvh1iSjIcUwCURv96U9/whVXXIH169dj79690Ol07XqeX/3qV9Bqz+T0mJgYXHHFFfLPISEhMJvNqKio8Hnc4MGDfR4DAFdeeaXPfWc/hoioPXgmgaiNjhw5gtLSUng8Hhw7dqzdzxMaGurzs0ajUbzP4/G0+DiNRqN439mPISJqD55JIGoDl8uFyZMn46677sLAgQPxhz/8Ad9++y0sFovapRERdTieSSBqg6effhqiKGLFihV48sknMWDAANx///1ql0VE1CkYEohaaceOHVi2bBnefvttmEwmaLVavP322/jiiy+watUqtcsjIupwGkmSJLWLIOqujh07hsTERHz99deqtWVudPHFF2PWrFmYNWuWqnUQUeDgmQSiLnDttdfi2muvVeW1Fy9eDIPBgOPHj6vy+kQUuHgmgagT/fLLL/IMCJ1Oh4SEhC6voaqqClVVVQC8DaEEQejyGogoMDEkEBERkSJebiAiIiJFDAlERESkiCGBiIiIFDEkEBERkSKGBCIiIlLEkEBERESKGBKIiIhIEUMCERERKfr/6hlct9xxIBMAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(pred_x, pred_y, label=\"Predicted\", marker=\"o\")\n",
    "plt.scatter(true_x, true_y, label=\"Real\", marker=\"x\")\n",
    "\n",
    "plt.axis(\"image\")\n",
    "plt.xlabel(\"x [mm]\")\n",
    "plt.ylabel(\"y [mm]\")\n",
    "plt.legend(loc=\"center left\", bbox_to_anchor=(1, 0.5))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We plot the distribution of errors between the points. This shows that the error is generally less than about 0.3 mm, but occasionally reaches values up to approximately 0.4 mm. If we were to use a more complex neural network, we could extract more complexities and nuances of the data, and the accuracy would likely improve."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pred_x, pred_y, true_x, true_y = compare_model_to_truth(model, lens, num_rays=1000)\n",
    "\n",
    "error = np.sqrt((pred_x - true_x) ** 2 + (pred_y - true_y) ** 2)\n",
    "plt.hist(error, edgecolor=\"black\", bins=25, alpha=0.5)\n",
    "plt.xlabel(\"Error [mm]\")\n",
    "plt.ylabel(\"Frequency\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 5: Measure Inference Speed\n",
    "\n",
    "In this step, we will measure the inference speed of the trained neural network model. The inference speed is a critical factor in evaluating the performance of the surrogate model, especially when compared to traditional ray tracing methods. We will:\n",
    "\n",
    "1. Generate a large number of random rays.\n",
    "2. Perform a forward pass through the neural network model multiple times.\n",
    "3. Measure the time taken for these forward passes.\n",
    "4. Calculate the average time per forward pass and the effective speed in terms of ray-surfaces per second.\n",
    "\n",
    "This will help us understand the computational efficiency of the surrogate model and its potential advantages over conventional ray tracing techniques."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_rays = 1_000_000\n",
    "Hx, Hy, Px, Py = generate_random_coords(num_rays)\n",
    "\n",
    "sample_input = torch.tensor(np.column_stack((Hx, Hy, Px, Py)), dtype=torch.float32).to(\n",
    "    device,\n",
    ")\n",
    "\n",
    "# Warm-up the GPU by running the model a few times\n",
    "for _ in range(10):\n",
    "    _ = model(sample_input)\n",
    "\n",
    "# Measure the time taken for a forward pass\n",
    "num_its = 100\n",
    "\n",
    "start_time = time.time()\n",
    "with torch.no_grad():  # Disable gradient calculation for inference\n",
    "    for _ in range(num_its):\n",
    "        _ = model(sample_input)\n",
    "end_time = time.time()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Neural Network Inference Speed: 57.8 billion ray-surfaces per second\n"
     ]
    }
   ],
   "source": [
    "avg_time = (end_time - start_time) / num_its  # Average time per forward pass\n",
    "\n",
    "num_surfaces = len(lens.surface_group.surfaces)  # Number of surfaces in the lens system\n",
    "rss = num_rays * num_surfaces / avg_time / 1e9  # Ray-surfaces per second\n",
    "\n",
    "print(f\"Neural Network Inference Speed: {rss:.1f} billion ray-surfaces per second\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The final _effective_ speed of the model is **57.8 billion ray-surfaces per second**. We are not actually ray tracing here, so this metric may not be considered fully representative. Nonetheless, this allows for a direct comparison to the ray-traced result. Compare this result to a typical raytrace speed of approximately 5 million ray-surfaces per second for the double Gauss lens in Optiland."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Conclusions\n",
    "\n",
    "- This notebook demonstrated how to create a surrogate ray tracing model using Optiland for data generation and PyTorch for model training.\n",
    "- We modeled a double Gauss lens system and generated ray tracing data.\n",
    "- A PyTorch-based neural network was trained to predict intersection points based on ray field and pupil coordinates.\n",
    "- The model's performance was assessed and compared to direct ray-traced results, showing reasonable accuracy.\n",
    "- The inference speed of the surrogate model was measured, demonstrating significant computational efficiency improvements over traditional ray tracing methods."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
